#include <stdio.h>
#include <sys/msg.h>
#include <errno.h>

#define MY_MQ_ID 111

typedef struct {
	long type;
	char message[80];
}my_mq_type;

int main(){
	my_mq_type mt;
	int msgid=msgget(MY_MQ_ID,0);
	int ret;
	//move first
	if(msgid>0){
		ret=msgctl(msgid,IPC_RMID,NULL);
		if(ret==-1){
			printf("mq remove error %s\n",strerror(errno));
			exit(-1);
		}
		msgid=-1;
	}
	
	if(msgid<0){
		printf("mq not exist ,now create it\n");
		msgid=msgget(MY_MQ_ID,0x666 | IPC_CREAT);
		if(msgid<0){
			printf("mq create error %s\n",strerror(errno));
			exit(-1);
		}
	}

	printf("get mq :%d\n",msgid);
	
	struct msqid_ds buf;
	ret=msgctl(msgid , IPC_STAT ,&buf);
	printf("mq buf:%d,%d,%d,%d",buf.msg_perm.uid,buf.msg_perm.gid,buf.msg_perm.mode,buf.msg_qbytes);
	buf.msg_qbytes=4096;
	ret=msgctl(msgid,IPC_SET,&buf);
	if(ret==0){
		printf("succefully change size of %d\n",msgid);
	}else{
		printf("mq error %s , ret:%d\n",strerror(errno),ret);
	}
	
	ret=msgsnd(msgid,(const void*)&mt,sizeof(my_mq_type),IPC_NOWAIT|0);
	if(ret!=-1){
		printf("send ok\n");
	}else{
		printf("mq send error %s , ret:%d\n",strerror(errno),ret);
	}
	return 0;
}
